cairo: add fast paths for u8 and u16 gray gamma
authorØyvind Kolås <pippin@gimp.org>
Thu, 15 Dec 2016 20:01:45 +0000 (21:01 +0100)
committerØyvind Kolås <pippin@gimp.org>
Thu, 15 Dec 2016 20:01:45 +0000 (21:01 +0100)
extensions/cairo.c
tools/babl-verify.sh

index a8247f6412cc421e17d47de412df3e08f62ef3db..2d807cb055dba1068f439a59866fc6c1fe817448 100644 (file)
@@ -125,6 +125,9 @@ conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+
+
+
 static inline long
 conv_yA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
 {
@@ -163,6 +166,40 @@ conv_yA16_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+static inline long
+conv_y8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+  while (n--)
+    {
+      unsigned char val = *src++;
+      *dst++ = val;
+      *dst++ = val;
+      *dst++ = val;
+      *dst++ = 0xff;
+    }
+  return samples;
+}
+
+static inline long
+conv_y16_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+  uint16_t *s16 = (void*)src;
+  while (n--)
+    {
+#define div_257(a) ((((a)+128)-(((a)+128)>>8))>>8)
+      uint16_t v16 = *s16++;
+      unsigned char val = div_257(v16);
+#undef dib_257
+      *dst++ = val;
+      *dst++ = val;
+      *dst++ = val;
+      *dst++ = 0xff;
+    }
+  return samples;
+}
+
 static long
 conv_rgbA_gamma_float_cairo32_le (unsigned char *src,
                                   unsigned char *dst,
@@ -273,6 +310,12 @@ init (void)
       babl_conversion_new (babl_format ("Y'A u16"), f32, "linear",
                            conv_yA16_cairo32_le, NULL);
 
+
+      babl_conversion_new (babl_format ("Y' u8"), f32, "linear",
+                           conv_y8_cairo32_le, NULL);
+      babl_conversion_new (babl_format ("Y' u16"), f32, "linear",
+                           conv_y16_cairo32_le, NULL);
+
       babl_conversion_new (babl_format ("RGBA float"), f32, "linear",
                            conv_rgbafloat_cairo32_le, NULL);
 
index bde6aa0c1c70e0591486242572ab3bf106ad9321..5d917bb8b31d84b70f36b327133014df7371b6d4 100755 (executable)
@@ -28,8 +28,6 @@ $base_path/tools/babl-verify "$format" "RGBA float" "x"
 $base_path/tools/babl-verify "RGBA float" "$format" "x"
 $base_path/tools/babl-verify "$format" "R'G'B'A float" "x"
 $base_path/tools/babl-verify "R'G'B'A float" "$format" "x"
-$base_path/tools/babl-verify "$format" "CIE Lab float" "x"
-$base_path/tools/babl-verify "CIE Lab float" "$format" "x"
 
 $base_path/tools/babl-verify "$format" "cairo-ARGB32"
 $base_path/tools/babl-verify "$format" "RaGaBaA float"
@@ -38,6 +36,4 @@ $base_path/tools/babl-verify "$format" "RGBA float"
 $base_path/tools/babl-verify "RGBA float" "$format"
 $base_path/tools/babl-verify "$format" "R'G'B'A float"
 $base_path/tools/babl-verify "R'G'B'A float" "$format"
-$base_path/tools/babl-verify "$format" "CIE Lab float"
-$base_path/tools/babl-verify "CIE Lab float" "$format"